
// 变量提升Hoisting：let和var的区别
// （1）var声明的变量会存在变量提升(Hoisting)，创建VO，声明bar，值为undefined
console.log(bar); // undefined
var bar = 200;

// （2）声明变量bar1并赋值为200，所以打印出来为200
var bar1 = 200;
console.log(bar1); // 200


// （3）let声明的变量不会存在变量提升，所以执行console时未找到bar2，抛出异常
// console.log(bar2); // ReferenceError: bar2 is not defined
// let bar2 = 200;

// （4）未使用var声明的变量不会放在VO对象中，只是给全局Global添加了一个属性。所以在VO查找不到bar3，抛出异常。而用this可以找到
console.log(bar3); // ReferenceError: bar3 is not defined
console.log(this.bar3); // undefined
bar3 = 100;


// （5）函数声明优先级高于变量声明
function foo(){
    console.log(f1); // [Function f1]
    console.log(f2); // undefined

    var f1 = 'hoisting';
    var f2 = function(){};
    function f1(){}
}
foo();

// （6）let不能重复声明
var a = 10;
var a = 20;
console.log(a); // 20

let b = 100;
let b = 200;
console.log(b); // SyntaxError: Identifier 'b' has already been declared


